package com.vlong.town.service.user;

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.vlong.town.entity.user.User;
import com.vlong.town.entity.userOrgRef.UserOrgRef;
import com.vlong.town.entity.userRoleRef.UserRoleRef;
import com.vlong.town.mapper.user.UserMapper;
import com.vlong.town.mapper.userOrgRef.UserOrgRefMapper;
import com.vlong.town.mapper.userRoleRef.UserRoleRefMapper;
import com.vlong.town.util.data.DataUtil;

/**
 * 用户业务实现类
 * @author Assassin
 */
@Service
public class UserService {

    // Fields

    @Autowired
    private UserMapper userMapper;// 用户Mapper接口
    @Autowired
    private UserOrgRefMapper  userOrgRefMapper;
    @Autowired
    private UserRoleRefMapper userRoleRefMapper;
    

    // Methods

    /**
     * 添加用户
     *
     * @param userId         用户标识[主键值]
     * @param status         用户状态[1-可用 | 2-不可用]
     * @param type           用户类型[1-农户 | 2-专家 | 3-管理员]
     * @param orgId          组织机构[预留字段，默认1]
     * @param categoryId     专家分类标识
     * @param userName       用户名[可以用作登录账号使用]]
     * @param realName       真实姓名
     * @param telphone       手机号码[可以用作登录账号使用]
     * @param email          电子邮箱
     * @param password       登录密码
     * @param loginToken     登录Token
     * @param registrationId 推送Id
     * @param createTime     创建时间
     * @param updateTime     更新时间[初始化=创建时间]
     * @return Long userId 添加后的数据库主键值
     */
    @Transactional
    public Long add(Long userId, Integer status, Integer type, Long orgId, String categoryId, String userName, String realName, String telphone, String email, String password, String loginToken, String registrationId, Long createTime, Long updateTime,String roleIds) {
        // 构造用户参数实体
        User user = new User();
        user.setUserId(userId);// Set 用户标识[主键值]
        user.setStatus(status);// Set 用户状态[1-可用 | 2-不可用]
        user.setType(type);// Set 用户类型[1-农户 | 2-专家 | 3-管理员]
        user.setOrgId(orgId);// Set 组织机构[预留字段，默认1]
        user.setCategoryId(categoryId);// Set 专家分类标识
        user.setUserName(userName);// Set 用户名[可以用作登录账号使用]]
        user.setRealName(realName);// Set 真实姓名
        user.setTelphone(telphone);// Set 手机号码[可以用作登录账号使用]
        user.setEmail(email);// Set 电子邮箱
        user.setPassword(password);// Set 登录密码
        user.setLoginToken(loginToken);// Set 登录Token
        user.setRegistrationId(registrationId);// Set registrationId
        user.setCreateTime(createTime);// Set 创建时间
        user.setUpdateTime(updateTime);// Set 更新时间[初始化=创建时间]
        // 调用用户Mapper接口
        this.userMapper.insert(user);
        // 添加后的数据库主键值
     	Long userid = user.getUserId();
     	//添加用户机构关联关系
        this.userOrgRefMapper.insert(new  UserOrgRef(null,userid,orgId));
        
        // 用户添加成功、添加用户、角色关联关系
 		String[] roleIdArr = roleIds.split(",");
 		for(String roleId : roleIdArr) {
 			if(!roleId.equals("0")) {
 				this.userRoleRefMapper.insert(new UserRoleRef(null, orgId, userid, Long.parseLong(roleId)));
 			}
 		}
        return user.getUserId();
    }

    /**
     * 删除用户
     *
     * @param userId 主键值
     */
    @Transactional
    public void delete(Long userId) {
        // 调用用户Mapper接口
        this.userMapper.delete(userId);
    }

    /**
     * 更新用户
     *
     * @param userId         用户标识[主键值]
     * @param status         用户状态[1-可用 | 2-不可用]
     * @param type           用户类型[1-农户 | 2-专家 | 3-管理员]
     * @param orgId          组织机构[预留字段，默认1]
     * @param categoryId     专家分类标识
     * @param userName       用户名[可以用作登录账号使用]]
     * @param realName       真实姓名
     * @param telphone       手机号码[可以用作登录账号使用]
     * @param email          电子邮箱
     * @param password       登录密码
     * @param loginToken     登录Token
     * @param registrationId 推送Id
     * @param createTime     创建时间
     * @param updateTime     更新时间[初始化=创建时间]
     */
    @Transactional
    public void edit(Long userId, Integer status, Integer type, Long orgId, String categoryId, String userName, String realName, String telphone, String email, String password, String loginToken, String registrationId, Long createTime, Long updateTime,String roleIds) {
        // 构造用户参数实体
        User user = new User();
        user.setUserId(userId);// Set 用户标识[主键值]
        user.setStatus(status);// Set 用户状态[1-可用 | 2-不可用]
        user.setType(type);// Set 用户类型[1-农户 | 2-专家 | 3-管理员]
        user.setOrgId(null);// Set 组织机构[预留字段，默认1]
        user.setCategoryId(categoryId);// Set 专家分类标识
        user.setUserName(userName);// Set 用户名[可以用作登录账号使用]]
        user.setRealName(realName);// Set 真实姓名
        user.setTelphone(telphone);// Set 手机号码[可以用作登录账号使用]
        user.setEmail(email);// Set 电子邮箱
        user.setPassword(password);// Set 登录密码
        user.setLoginToken(loginToken);// Set 登录Token
        user.setRegistrationId(registrationId);// Set RegistrationId
        user.setCreateTime(createTime);// Set 创建时间
        user.setUpdateTime(updateTime);// Set 更新时间[初始化=创建时间]
        // 调用用户Mapper接口
        this.userMapper.update(user);
        
     // 用户编辑成功、编辑用户、角色关联关系
		
 		// 检查角色信息是否更新
 		List<UserRoleRef> refList = this.userRoleRefMapper.selectList(userId);
 		if(refList == null || refList.size() == 0) {
 			String[] roleIdArr = roleIds.split(",");
 			for(String roleId : roleIdArr) {
 				if(!roleId.equals("0")) {
 					this.userRoleRefMapper.insert(new UserRoleRef(null, orgId, userId, Long.parseLong(roleId)));
 				}
 			}
 		} else {
 			String currRoleIds = "";
 			for(UserRoleRef ref : refList) {
 				currRoleIds += ref.getRoleId().longValue() + ",";
 			}
 			String[] currRoleArr = currRoleIds.split(",");
 			
 			if(roleIds!=null&&roleIds!=""){
 				String[] roleIdArr = roleIds.split(",");
 				if(!Arrays.equals(currRoleArr, roleIdArr)) {
 					this.userRoleRefMapper.delete(userId);
 					for(String roleId : roleIdArr) {
 						if(!roleId.equals("0")) {
 							this.userRoleRefMapper.insert(new UserRoleRef(null, orgId, userId, Long.parseLong(roleId)));
 						}
 					}
 				}
 			}
 		}
        
    }

    /**
     * 主键查询用户
     *
     * @param userId 用户Id
     * @return User 实体
     */
    public User queryById(Long userId) {
        // 调用用户Mapper接口
        return this.userMapper.selectById(userId);
    }

    /**
     * 根据条件查询用户列表
     *
     * @param userId     用户标识[主键值]
     * @param status     用户状态[1-可用 | 2-不可用]
     * @param type       用户类型[1-农户 | 2-专家 | 3-管理员]
     * @param orgId      组织机构[预留字段，默认1]
     * @param categoryId 专家分类标识
     * @param userName   用户名[可以用作登录账号使用]]
     * @param realName   真实姓名
     * @param telphone   手机号码[可以用作登录账号使用]
     * @param email      电子邮箱
     * @param password   登录密码
     * @param loginToken 登录Token
     * @param createTime 创建时间
     * @param updateTime 更新时间[初始化=创建时间]
     * @return List<User> 实体List
     */
    public List<User> queryList(Long userId, Integer status, Integer type, Long orgId, String categoryId, String userName, String realName, String telphone, String email, String password, String loginToken, Long createTime, Long updateTime) {
        // 构造用户参数实体
        User user = new User();
        user.setUserId(userId);// Set 用户标识[主键值]
        user.setStatus(status);// Set 用户状态[1-可用 | 2-不可用]
        user.setType(type);// Set 用户类型[1-农户 | 2-专家 | 3-管理员]
        user.setOrgId(orgId);// Set 组织机构[预留字段，默认1]
        user.setCategoryId(categoryId);// Set 专家分类标识
        user.setUserName(userName);// Set 用户名[可以用作登录账号使用]]
        user.setRealName(realName);// Set 真实姓名
        user.setTelphone(telphone);// Set 手机号码[可以用作登录账号使用]
        user.setEmail(email);// Set 电子邮箱
        user.setPassword(password);// Set 登录密码
        user.setLoginToken(loginToken);// Set 登录Token
        user.setCreateTime(createTime);// Set 创建时间
        user.setUpdateTime(updateTime);// Set 更新时间[初始化=创建时间]
        // 调用用户Mapper接口
        return this.userMapper.selectList(user);
    }

    /**
     * 查询登录信息
     *
     * @param type     用户类型[1-农户 | 2-专家 | 3-管理员]
     * @param account  登录手机号
     * @param password 登录密码
     * @return 用户实体
     */
    public User queryLogin(Integer type, String account, String password) {
        HashMap<String, Object> paramMap = new HashMap<String, Object>();
        paramMap.put("status", 1);
        paramMap.put("type", type);
        paramMap.put("account", account);
        paramMap.put("password", DataUtil.generateMD5(password.getBytes()));
        List<User> loginUserList = this.userMapper.selectLogin(paramMap);
        if (loginUserList != null && loginUserList.size() > 0) {
            return loginUserList.get(0);
        } else {
            return null;
        }
    }
}
